using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.BulletX
{
	internal class SupportVertexCallback : ITriangleCallback
	{
		private Vector3 _supportVertexLocal;

		private Matrix _worldTransform;
		private float _maxDot;
		private Vector3 _supportVecLocal;

		public SupportVertexCallback(Vector3 supportVecWorld, Matrix trans)
		{
			_supportVertexLocal = new Vector3();
			_worldTransform = trans;
			_maxDot = -1e30f;
			_supportVecLocal = Vector3.TransformNormal(supportVecWorld, _worldTransform);
		}

		public Matrix WorldTransform { get { return _worldTransform; } set { _worldTransform = value; } }
		public float MaxDot { get { return _maxDot; } set { _maxDot = value; } }
		public Vector3 SupportVectorLocal { get { return _supportVecLocal; } set { _supportVecLocal = value; } }

		public Vector3 SupportVertexLocal { get { return _supportVertexLocal; } }
		public Vector3 SupportVertexWorldSpace { get { return MathHelper.MatrixToVector(_worldTransform, _supportVertexLocal); } }

		#region ITriangleCallback Members
		public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex)
		{
			for (int i = 0; i < 3; i++)
			{
				float dot = Vector3.Dot(_supportVecLocal, triangle[i]);
				if (dot > _maxDot)
				{
					_maxDot = dot;
					_supportVertexLocal = triangle[i];
				}
			}
		}
		#endregion
	}
}
